﻿#define _CRT_SECURE_NO_WARNINGS 1


////珠玑妙算
////珠玑妙算游戏（the game of master mind）的玩法如下。
////计算机有4个槽，每个槽放一个球，颜色可能是红色（R）、黄色（Y）、绿色（G）或蓝色（B）。例如，计算机可能有RGGB 4种（槽1为红色，槽2、3为绿色，槽4为蓝色）。
////作为用户，你试图猜出颜色组合。打个比方，你可能会猜YRGB。要是猜对某个槽的颜色，则算一次“猜中”；要是只猜对颜色但槽位猜错了，则算一次“伪猜中”。
////注意，“猜中”不能算入“伪猜中”。
////给定一种颜色组合solution和一个猜测guess，编写一个方法，返回猜中和伪猜中的次数answer，其中answer[0]为猜中的次数，answer[1]为伪猜中的次数。
////
////示例：
////输入： solution = "RGBY", guess = "GGRR"
////输出：[1, 1]
////解释： 猜中1次，伪猜中1次。
//
//
//int* masterMind(char* solution, char* guess, int* returnSize) {
//    int* arr = (int*)malloc(sizeof(int) * 2);
//    *returnSize = 2;
//    int count1 = 0;
//    int count2 = 0;
//    for (int i = 0; i < 4; i++)
//    {
//        if (solution[i] == guess[i])
//        {
//            count1++;
//            solution[i] = '0';
//            guess[i] = '0';
//        }
//    }
//    for (int i = 0; i < 4; i++)
//    {
//        for (int j = 0; j < 4; j++)
//        {
//            if (guess[j] == '0')
//                continue;
//            else if (solution[i] == guess[j])
//            {
//                guess[j] = '0';
//                count2++;
//                break;
//            }
//        }
//    }
//    arr[0] = count1;
//    arr[1] = count2;
//
//    return arr;
//}












////寻找奇数
////描述
////现在有一个长度为 n 的正整数序列，其中只有一种数值出现了奇数次，其他数值均出现偶数次，请你找出那个出现奇数次的数值。
////
////输入描述：
////第一行：一个整数n，表示序列的长度。第二行：n个正整数ai，两个数中间以空格隔开。
////输出描述：
////一个数，即在序列中唯一出现奇数次的数值。
////示例1
////输入：5
////      2 1 2 3 1
////输出：3
////
////示例2
////输入：1
////      1
////输出：1
//
//#include<stdio.h>
//int main()
//{
//    int n = 0;
//    scanf("%d", &n);
//    int num = 0;
//    int count = 0;
//    for (int i = 0; i < n; i++)
//    {
//        scanf("%d", &num);
//        count ^= num;
//    }
//    printf("%d", count);
//    return 0;
//}











//
////寻找峰值
////描述
////给定一个长度为n的数组nums，请你找到峰值并返回其索引。数组可能包含多个峰值，在这种情况下，返回任何一个所在位置即可。
////1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
////2.假设 nums[-1] = nums[n] = -\infty−∞
////3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
////4.你可以使用O(logN)的时间复杂度实现此问题吗？
////如输入[2, 4, 1, 2, 7, 8, 4]时，会形成两个山峰，一个是索引为1，峰值为4的山峰，另一个是索引为5，峰值为8的山峰
////
////示例1
////输入：[2, 4, 1, 2, 7, 8, 4]
////返回值：1
////说明：
////4和8都是峰值元素，返回4的索引1或者8的索引5都可以
////
////示例2
////输入：[1, 2, 3, 1]
////返回值：2
////说明：
////3 是峰值元素，返回其索引 2
//
//int findPeakElement(int* nums, int numsLen) {
//    int left = 0;
//    int right = numsLen - 1;
//    while (left < right)
//    {
//        int mid = (left + right) / 2;
//        if (nums[mid] < nums[mid + 1])
//            left = mid + 1;
//        else
//            right = mid;
//    }
//    return left;
//}











////数对
////描述
////牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
////但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
////牛牛希望你能帮他计算一共有多少个可能的数对。
////
////输入描述：
////输入包括两个正整数n, k(1 <= n <= 10 ^ 5, 0 <= k <= n - 1)。
////输出描述：
////对于每个测试用例, 输出一个正整数表示可能的数对数量。
////
////示例1
////输入：5 2
////输出：7
////说明：
////满足条件的数对有(2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5), (5, 3)
//
//
//#include<stdio.h>
//int main()
//{
//    long int n = 0;
//    long int k = 0;
//    scanf("%ld %ld", &n, &k);
//    if (k == 0)
//        printf("%ld", n * n);
//    else
//    {
//        long int count = 0;
//        for (long int y = k + 1; y <= n; y++)
//        {
//            count += (n / y) * (y - k);
//            long int temp = n % y;
//            if (temp >= k)
//                count += temp - k + 1;
//        }
//        printf("%ld", count);
//    }
//    return 0;
//}